/*
 * 
*/ 

#ifndef SALES_DATA_H
#define SALES_DATA_H

#include <string>
#include <iostream>
/*
1.类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元;
2.友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限,友元不是类的成员也不受它所在区域访问控制级别的约束;
3.
*/

class Sales_data {
// 为Sales_data的非成员函数所做的友元声明
friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);

public:  // 添加了访问说明符
	// 新增加的构造函数
	Sales_data() = default;
	// 构造函数初始化列表
	Sales_data(const std::string &s): bookNo(s) { }
	Sales_data(const std::string &s, unsigned n, double p):
	           bookNo(s), units_sold(n), revenue(p*n) { }
	Sales_data(std::istream &);

	// operations on Sales_data objects
	std::string isbn() const { return bookNo; }
	Sales_data& combine(const Sales_data&);
	double avg_price() const;

private: // 添加访问说明符
	std::string bookNo;
	unsigned units_sold = 0;
	double revenue = 0.0;
};


// Sales_data 接口的非成员组成部分的声明
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

// used in future chapters
inline 
bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
	return lhs.isbn() < rhs.isbn();
}
#endif
